package com.zzy.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.zzy.oss.service.OssService;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;

import static com.zzy.oss.utils.ConstantPropertiesUtils.*;

/**
 * @Author kazu
 * @Date 2023/2/4 21:02
 * @Version 1.0
 */
@SuppressWarnings({"all"})
@Service
public class OssServiceImpl implements OssService {

//	@Override
//	public String uploadFile(MultipartFile file) throws IOException {
//		OSS ossClient = new OSSClientBuilder().build(END_POINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
//		String fileName = new DateTime().toString("yyyy/MM/dd") +
//				"/" +
//				UUID.randomUUID().toString().replaceAll("-", "") +
//				file.getOriginalFilename();
//		InputStream inputStream = file.getInputStream();
//		// 创建PutObjectRequest对象。
//		PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, fileName, inputStream);
//		// 设置该属性可以返回response。如果不设置，则返回的response为空。
//		putObjectRequest.setProcess("true");
//		// 创建PutObject请求。
//		PutObjectResult result = ossClient.putObject(putObjectRequest);
//		// 如果上传成功，则返回200。
////		System.out.println(result.getResponse());
//
//		return result.getResponse().getUri();
//	}
	
	
	@Override
	public Map<String, Object> uploadFile() throws UnsupportedEncodingException {
		// 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
		String accessId = ACCESS_KEY_ID;
		String accessKey = ACCESS_KEY_SECRET;
		// Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
		String endpoint = END_POINT;
		// 填写Bucket名称，例如examplebucket。
		String bucket = BUCKET_NAME;
		// 填写Host地址，格式为https://bucketname.endpoint。
		String host = "https://" + bucket + "." + endpoint;
		// 设置上传回调URL，即回调服务器地址，用于处理应用服务器与OSS之间的通信。OSS会在文件上传完成后，把文件上传信息通过此回调URL发送给应用服务器。
//		String callbackUrl = "https://192.168.0.0:8888";
		// 设置上传到OSS文件的前缀，可置空此项。置空后，文件将上传至Bucket的根目录下。
		
		String dir = new DateTime().toString("yyyy/MM/dd") + "/";
//		String dir = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "/";
		
		// 创建ossClient实例。
		OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
		long expireTime = 30;
		long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
		Date expiration = new Date(expireEndTime);
		PolicyConditions policyConds = new PolicyConditions();
		policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
		policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
		
		String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
		byte[] binaryData = postPolicy.getBytes("utf-8");
		String encodedPolicy = BinaryUtil.toBase64String(binaryData);
		String postSignature = ossClient.calculatePostSignature(postPolicy);
		
		Map<String, Object> respMap = new LinkedHashMap<String, Object>();
		respMap.put("accessId", accessId);
		respMap.put("policy", encodedPolicy);
		respMap.put("signature", postSignature);
		respMap.put("dir", dir);
		respMap.put("host", host);
		respMap.put("expire", String.valueOf(expireEndTime / 1000));
		
		return respMap;
	}
	
	
}
